package com.ruoyi.web.controller.tool.mqttClient;

import com.ruoyi.common.core.controller.BaseController;
import org.eclipse.paho.client.mqttv3.*;
import org.springframework.context.ApplicationContext;

/**
 * 发布消息的回调类
 * <p>
 * 必须实现MqttCallback的接口并实现对应的相关接口方法CallBack 类将实现 MqttCallBack。
 * 每个客户机标识都需要一个回调实例。在此示例中，构造函数传递客户机标识以另存为实例数据。 在回调中，将它用来标识已经启动了该回调的哪个实例。
 * 必须在回调类中实现三个方法：
 * <p>
 * public void messageArrived(MqttTopic topic, MqttMessage message)接收已经预订的发布。
 * <p>
 * public void connectionLost(Throwable cause)在断开连接时调用。
 * <p>
 * public void deliveryComplete(MqttDeliveryToken token)) 接收到已经发布的 QoS 1 或 QoS 2
 * 消息的传递令牌时调用。 由 MqttClient.connect 激活此回调。
 */
public class MqttCallback extends BaseController implements org.eclipse.paho.client.mqttv3.MqttCallback {


    private ApplicationContext context;

    private MqttClient client;

    public MqttCallback(MqttClient client) {
        this.client = client;
        System.out.println("初始化mqtt回调");
    }

    public void connectionLost(Throwable cause) {
        // 连接丢失后，一般在这里面进行重连
        System.out.println("连接断开，开始重连");
        long reconnectTimes = 1;
        while (true) {
            try {
                if (client.isConnected()) {
                    System.out.println("mqtt reconnect success end");
                    return;
                }
                System.out.println("mqtt reconnect times = {} try again..." + reconnectTimes++);
                client.reconnect();
            } catch (MqttException e) {
                System.out.println("MqttException:" + e);
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e1) {
                // e1.printStackTrace();
            }
        }
    }

    public void deliveryComplete(IMqttDeliveryToken token) {
        System.out.println("deliveryComplete---------" + token.isComplete());
    }

    public void messageArrived(String topic, MqttMessage message) throws Exception {
        // subscribe后得到的消息会执行到这里面
        System.out.println("接收消息主题 : " + topic);
        System.out.println("接收消息Qos : " + message.getQos());
        String res = new String(message.getPayload());
        System.out.println("接收消息内容 : " + res);
    }

}
